package main.leetcode.clockin.June;

import main.datastruc.TreeNode;

import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;

/**
 * 1028. 从先序遍历还原二叉树 我们从二叉树的根节点 root 开始进行深度优先搜索。
 *
 * <p>在遍历中的每个节点处，我们输出 D 条短划线（其中 D 是该节点的深度），然后输出该节点的值。（如果节点的深度为 D，则其直接子节点的深度为 D + 1。根节点的深度为 0）。
 *
 * <p>如果节点只有一个子节点，那么保证该子节点为左子节点。
 *
 * <p>给出遍历输出 S，还原树并返回其根节点 root。
 *
 * <p>提示：原始树中的节点数介于 1 和 1000 之间。 每个节点的值介于 1 和 10 ^ 9 之间。
 */
public class day18 {
    public static void main(String[] args) {
        System.out.println(new day18().recoverFromPreorder("10-7--8"));
        //        System.out.println(new day18().recoverFromPreorder("1-2--3--4-5--6--7"));
        //        System.out.println(new day18().recoverFromPreorder("1-401--349---90--88"));
    }

    public TreeNode recoverFromPreorder(String S) {
        HashMap<Integer, Deque<TreeNode>> map = new HashMap<>();
        int deep, val;
        char[] chars = S.toCharArray();
        TreeNode parent;
        for (int i = 0; i < chars.length; ) {
            deep = 0;
            while (i < chars.length && chars[i] == '-') {
                ++deep;
                ++i;
            }
            val = 0;
            while (i < chars.length && chars[i] != '-') {
                val = val * 10 + chars[i] - '0';
                ++i;
            }
            TreeNode node = new TreeNode(val);
            Deque<TreeNode> q = map.getOrDefault(deep, new LinkedList<>());
            q.push(node);
            map.put(deep, q);
            if (map.containsKey(deep - 1)) {
                parent = map.get(deep - 1).peekFirst();
                if (parent.left == null) {
                    parent.left = node;
                } else {
                    parent.right = node;
                }
            }
        }
        return map.get(0).peekFirst();
    }
}
